
/**
 * 第三方插件封装对象
 * @namespace bs 根命名名称
 */
;var bs = window.bs || {};
/***
 * 第三方插件根目录
 * @type {string}
 */
bs.usingDir = '/res/';
bs.debug = true;
if (location.search.indexOf("debug") > -1) {
    bs.debug = true;
}
bs.charset = 'utf-8';
(function($){
    /***
     * 日志控制打印
     * @description IE>=7时，使用IE内置对象console,其它浏览版本使用log4javascript
     * @param obj  {object}
     * @param level {*|string}
     * @param callback {*|function}
     *
     * @example
     * bs.log('hello word','info')
     */
    bs.log = function(obj,level,callback){
        level = level || 'debug';
        bs.debug = bs.debug || true;
        if (!bs.debug) return;
        if ($.browser.msie && $.browser.version >= 7 || window.console) {
            switch (level) {
                case "log":
                    console.log(obj);
                    break;
                case "info":
                    console.info(obj);
                    break;
                case "debug":
                    console.debug(obj);
                    break;
                case "trace":
                    console.trace(obj);
                    break;
                case "warn":
                    console.warn(obj);
                    break;
                case "error":
                    console.error(obj);
                    break;
                case "fatal":
                    console.log(obj);
                    break;
                case "dir":
                    console.dir(obj);
                    break;
                case "assert":
                    console.assert(obj);
                    break;
            }
            return;
        }
        if(typeof log4javascript != 'undefined'){
           _log(obj, level, callback);
        }else{
            var _p = bs.using.base + 'log/';
            var m = {
                js: _p + 'log4j.js'
            };
            bs.using.modules.log4j = m;
            bs.using.load('log4j',function(){
                _log(obj, level, callback);
            });
        }
        function _log(obj, level, callback) {
            try {
                if (!window.__logger) {
                    window.__logger = log4javascript.getLogger("log4jObject");
                    log4javascript.setEnabled(true);
                    var appender = new log4javascript.InPageAppender();
                    appender.layout.pattern = '%d{yyyy-MM-dd HH:mm:ss,SSS} [%c] %-5p - %m{1}%n';
                    window.__logger.addAppender(appender);
                }
                switch (level) {
                    case "info":
                        window.__logger.info(obj);
                        break;
                    case "debug":
                        window.__logger.debug(obj);
                        break;
                    case "trace":
                        window.__logger.trace(obj);
                        break;
                    case "warn":
                        window.__logger.warn(obj);
                        break;
                    case "error":
                        window.__logger.error(obj);
                        break;
                    case "fatal":
                        window.__logger.fatal(obj);
                        break;
                    case "dir":
                        window.__logger.dir(obj);
                        break;
                }
                if (bs.util.isFunction(callback)) {
                    callback.apply(this, arguments);
                }
            } catch (e) {}
        }
    }
    /**
     * @class 高亮显示功能
     * @description 关键字高亮显示
     * @param keyword {String} 关键字符串
     * @param dom {String} 查询范围元素
     * @see <a href="ttp://www.zhangxinxu.com/">by zhangxixnu 2010-06-21</a>
     *
     * @example
     * 示例：
     * bs.highlight($('#keyword').val(),'#main')
     */
    bs.textSearch = function(key, dom,options, callback){
           dom = dom || 'body';
            if(bs.util.isObject($.fn.textSearch)){
                    __textSearch();
            }else{
                var _p = bs.using.base + 'highlight/';
                var m = {
                    js: _p + 'jquery.textSearch.min.js'
                }
                bs.using.modules.textSearch = m;
                bs.using.load('textSearch',function(){
                    __textSearch();
                });
            }
           function __textSearch(){
               $(dom).textSearch(key, options);
               if (bs.isFunction(callback)) {
                   callback.call(me);
               }
           }
    };
    /***
     * @class 自动填充
     * @description 自动填充功能
     * @param id {string}
     * @param urlOrData {string|{}}
     * @param callback {*|function}
     * @param options {*|{}}
     */
    bs.autocomplete = function(id,urlOrData,callback,options){
          var d = {
            minChars: 1,
            selectFirst:false,
            matchCase:false,
            matchContains: true,
            autoFill: false
          };
        var _ext = {
            dataType: 'json',
            parse: function (data) {
                return $.map(data, function (row) {
                    return {
                        data: row,
                        value: row.id || '',
                        result: row.name || ''
                    };
                });//给后台交互的数据进行处理
            },
            formatItem: function (row, i, max) {
                return row.name || '';
            }
        };
        var isUrl = typeof urlOrData == "string";
        options = options || {};
        if(isUrl) {
            options = $.extend(d,_ext, options);
        }else{
            options = $.extend(d, options);
        };
        if(bs.util.isObject($.fn.autocomplete)){
            __autocomplete();
        }else{
            var _p = bs.using.base + 'form/autocomplete/1.1/';
            var m ={
                js: _p + 'jquery.autocomplete.min.js',
                css: _p + 'jquery.autocomplete.css'
            }
            bs.using.modules.autocomplete = m;
            bs.using.load('autocomplete',function(){
                __autocomplete();
            });
        } ;

        function __autocomplete(){
            $(id).autocomplete(urlOrData,options).result(function(event, data, formatted){
                if(bs.util.isFunction(callback)){
                    callback.apply(this,arguments);
                }
            });
            
        }   
    };
    /***
     * 鼠标浮动提示贴士
     * @param domid  {string}
     * @param content {string}
     * @param options  {*|object}
     * @param callback  {*|function}
     *
     * @config {String} skin 皮肤，默认为yellow，可选：base reset black cloud dark facebook lavender light lime liquid blue salmon yellow
     * @config {String|Object} hook 显示的位置
     * 可选：topleft topmiddle topright lefttop leftmiddle leftbottom bottomleft bottommiddle bottomright righttop rightmiddle rightbottom ，
     * 如果是对象，{target:"topleft",tooltip:"bottomleft"}
     *
     * @example
     *简单：
     * bs.tipped('#t1','这是t1的贴士')
     *
     * @example
     *自定义：
     *bs.tipped('#t2','这是t2的贴士',{skin:'blue',target:'topleft',tooltip:'bottomleft'})
     *
     * @see
     * <a href="http://projects.nickstakenburg.com/tipped/" target="_blank">nickstakenburg-封装组件主页</a>
     * |<a href="http://projects.nickstakenburg.com/tipped/documentation" target="_blank">nickstakenburg-API</a>
     */
    bs.tipped = function (domid, content, options, callback) {
      if(typeof options == 'string'){
          return bs.tipped.method[options](domid);
      };
      options = options ||{};
      var d = {
          skin: 'yellow',
          show: false
      };
      options = $.extend({},d, options);

      if(typeof Tipped !='undefined'){
          __tipped(domid,content, options, callback);
      }else{
          var _p = bs.using.base + 'tip/tipped/2.5.6/';
          var m = {
            js: _p + 'tipped.min.js',
            css: _p + 'tipped.css'
          };
          bs.using.modules.tipped = m;
          if ($.browser.msie && $.browser.version < 9) {
              var m1 = {
                  js: _p + 'excanvas.js'
              };
              bs.using.modules.excanvas = m1;
              bs.using.modules.tipped.dependencies = ["excanvas"];
          }
          bs.using.load('tipped',function(){
              __tipped(domid,content, options, callback);
          });
      };
      function __tipped(domid,content, options, callback){
          Tipped.create(domid, content, options);
          if (options.show)Tipped.show(domid);
          if (bs.util.isFunction(callback)) {
              callback.call(this, Tipped);
          }
      };
    };
    /**
     *贴士显示
     * @function
     * @param domid {string}
     */
    bs.tipped.show = function(domid){
        Tipped.show(domid);
    };
    /**
     * 贴士隐藏
     * @function
     * @param domid {string}
     */
    bs.tipped.hide = function(domid){
        Tipped.hide(domid);
    };
    /**
     * 万能浮动层插件
     * @param domid  {string}
     * @param options {object}
     * @config target:{string}target 默认null 浮动层内容来源，优先选取来源，根据targetMode的不同，这里的参数类型也有所不同
     * @config targetMode:{string}默认"common" 字符串，关键字参数还有："ajax", "list", "remind"。表示浮动层的类型
     * @config targetAttr:{string}默认"rel" 自定义的标签属性。也是浮动层内容来源，可用作元素id，或是字符串
     * @config width:{string|number} 默认"auto" "inherit"，数值(px)(百分比等)，"auto"表宽度自动，"inherit"表宽度与方法触发元素宽度一样
     * @config offsets:{object}浮动层的偏移值。可正可负。如果为正值，右下方元素右下方偏移，左上方元素左上方偏移。偏移方向为扩散状,默认{x:0, y:0}
     * @config zIndex:{number} 浮动框层级。插件自带小三角层级为999+1，数值上总是大1，默认是999
     * @config eventType:{string}默认"hover",其他可选参数："click", "focus"，如果参数为其他，则绑定触发浮动层的显示与定位
     * @config showDelay:{number}事件类型(eventType)为"hover"时浮动层显示的延迟时间，单位毫秒,默认0
     * @config hideDelay:{number}鼠标移出对象时浮动层隐藏延迟时间 ,默认0
     * @config hoverHold:{boolean}默认true 布尔型，浮动层是否鼠标悬停。如果为false，只要鼠标移出触发元素，浮动层即隐藏
     * @config hoverFollow:{boolean}默认false 其他可选参数：true, "x""y"。是否鼠标跟随。"x"表示仅水平方向跟随，"y"为垂直方向，true或其他参数为任意方向跟随
     * @config container:{object}默认null jQuery对象，转载浮动层的容器，如果targetMode自定义，可以使用"plugin"关键字，表示使用插件自带容器
     * @config reverseSharp:{object} 默认fales 布尔型。尖角显示是否反转。默认ajax, remind是显示三角的，其他如list和自定义形式是不显示的
     * @config position:{string} "4-1" 浮动层显示的位置。
     * @config edgeAdjust:{string}  默认true 布尔型。如果浮动层在显示屏之外，是否调整浮动层位置
     * @config showCall:{function} 浮动层显示时候的回调函数
     * @config hideCall:{function} 浮动层隐藏时候的回调函数
     * @param callback
     *
     * @see <a href="http://www.zhangxinxu.com/wordpress/2010/12/jquery-powerfloat%E4%B8%87%E8%83%BD%E6%B5%AE%E5%8A%A8%E5%B1%82%E4%B8%8B%E6%8B%89%E5%B1%82%E6%8F%92%E4%BB%B6/" target="_blank">官方示例</a>
     *
     * @exmaple
     * 默认方式rel属性设置目标对象名称
     * bs.powerFloat('#trigger1');//默认id=trigger1对象属性rel=目标对象id的名称显示
     *
     * @example
     * targetModel为列表：
     * bs.powerFloat('#trigger9',{target:[{href:'#',text:'名称'},{href:'#',text:'name'}],targetMode:list});
     *
     * @example
     * targetModel为ajax
     * bs.powerFloat('#trigger10',{target:'http://www.baidu.com',targetMode:ajax});
     */
    bs.powerFloat = function(domid, options, callback){
        var d = {
            position: "1-4" // 4-1 1-4 5-7 2-3 2-1 6-8 3-4 4-3 8-6 1-2 7-5 3-2
        };
       // options = $.extend({},d,options);
        if(bs.util.isObject($.fn.powerFloat)){
            _powerFloat(domid, options, callback);
        }else{
            var _p = bs.using.base + 'tip/powerfloat/1.6.1/';
            var m = {
                js: _p + 'jquery-powerFloat-min.js',
                css: _p + 'powerFloat.css'
            };
            bs.using.modules.powerFloat = m;
            bs.using.load('powerFloat',function(){
                _powerFloat(domid, options, callback);
            });
        }
        function _powerFloat(domid, options, callback){
            var me = this;
            var obj = $(domid).powerFloat(options);
            if ($.isFunction(callback)) {
                callback.call(me, obj);
            }
        }
    };
    /***
     * tip隐藏
     * @ignore
     * @param timeout
     * @private
     */
    function __tip_hidden(timeout) {
        try {
            $('#bs_tip_overlay,#bs_tipbox').remove();
            if (!bs.util.isUndefined(timeout)) {
                window.clearTimeout(timeout);
            }
        } catch (e) {
        }
    };

    /**
     * tip显示
     * @ignore
     * @param options
     * @private
     */
    function __tip_show(options) {
        var me = this, timeout;
        var opts = $.extend({
            style: 'info',
            msg: ''
        }, options || {});
        var style = opts.style;
        switch (style) {
            case "info":
                style = "bs_tip_ico_hits";
                break;
            case "success":
                style = "bs_tip_ico_succ";
                break;
            case "error":
                style = "bs_tip_ico_fail";
                break;
            default:
                style = "bs_tip_ico_clear";
                break;
        }
        var str = '<span  class="' + style + '"></span>'
        str += opts.msg;
        str += '<span class="bs_tip_end"></span>';
        if ($('#bs_tipbox').size() == 0) {
            var strVar = '<div id="bs_tipbox" class="bs_tipbox_layer_wrap" style="display:none">';
            strVar += '<div id="mode_tips_v2" class="bs_tipbox_layer" style="z-index:10000;">';
            strVar += '<span class="bs_tip_ico_fail"></span>';
            // 操作失败，请稍后重试！
            strVar += '\u64cd\u4f5c\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\uff01';
            strVar += '<span class="bs_tip_end"></span>';
            strVar += '	</div>';

           // strVar += "<div class=\"bs_tip_move_temp\" id=\"bs_tipbox_move_temp\"></div><div class=\"bs_tip_overlay\"><iframe src=\"about:blank\" style=\"width:100%;height:" + $(document).height() + "px;filter:alpha(opacity=50);opacity:0.5;scrolling=no;border:none;z-index:870611;\"></iframe></div>";
            strVar += '</div>';
            strVar += "<div id=\"bs_tip_overlay\"><iframe src=\"about:blank\" style=\"width:100%;height:" + $(document).height() + "px;filter:alpha(opacity=50);opacity:0.5;scrolling=no;border:none;z-index:870611;\"></iframe></div>";
            $("body").append(strVar);
        }
        $('#mode_tips_v2').html(str);
        bs.ui.center('#bs_tipbox').show();
       /* $('#bs_tipbox').mouseover(function () {
            $(this).css('display', 'none');
        });*/
        window.clearTimeout(timeout);
        timeout = setTimeout(function () {
            __tip_hidden(timeout);
            if (bs.util.isFunction(opts.callback)) {
                opts.callback.call(me);
            }
            window.clearTimeout(timeout);
        }, opts.times * 1000);
    };
    bs.tip = {
        show: function (msg, time, callback) {
            msg = msg || "操作成功";
            __tip_show({
                msg: msg,
                style: 'info',
                times: time || 1,
                callback: callback
            });
        },
        succ: function (msg, time, callback) {
            msg = msg || "操作成功";
            __tip_show({
                msg: msg,
                style: 'success',
                times: time || 1,
                callback: callback
            });
        },
        error: function (msg, time, callback) {
            msg = msg || "操作失败";
            __tip_show({
                msg: msg,
                style: 'error',
                times: time || 1,
                callback: callback
            });
        },
        loading: function (msg, time, callback) {
            var me = this;
            var loadingImg = '<img src="' + bs.usingDir + 'images/tip.loading.gif"> ';
            msg = msg || '正在处理，请稍候...';
            msg = loadingImg + msg;
            __tip_show({
                msg: msg,
                style: 'clear',
                times: time || 666666,
                callback: callback
            });
            if (bs.util.isFunction(callback)) {
                callback.call(me);
            }
        },
        hidden: function () {
            __tip_hidden();
        }
    };
})(jQuery);